"""
时间工具模块：提供不同精度的当前时间获取功能
支持：年、月、日、时、分、秒、微秒级精度，以及时间戳转换
"""


from datetime import datetime
from typing import Union




'''
返回结果带格式分隔
'''
def get_current_time(
        precision: str = "microsecond",
        fmt: Union[str, None] = None
) -> str:
    """
    获取当前时间，支持多种精度控制或自定义格式

    :param precision: 时间精度，可选值：
        - 'year': 仅年份
        - 'month': 年-月
        - 'day': 年-月-日
        - 'hour': 年-月-日 时
        - 'minute': 年-月-日 时:分
        - 'second': 年-月-日 时:分:秒
        - 'microsecond': 年-月-日 时:分:秒.微秒（默认）
    :param fmt: 自定义格式字符串，若提供则忽略 precision 参数
        格式符号参考：
        %Y: 4位年份（如2025） %m: 2位月份 %d: 2位日期
        %H: 24小时制 %M: 分钟 %S: 秒 %f: 微秒
    :return: 格式化后的时间字符串
    :raises ValueError: 当 precision 为无效值时触发
    """
    # 预定义精度对应的格式字符串
    precision_formats = {
        'year': "%Y",
        'month': "%Y-%m",
        'day': "%Y-%m-%d",
        'hour': "%Y-%m-%d %H",
        'minute': "%Y-%m-%d %H:%M",
        'second': "%Y-%m-%d %H:%M:%S",
        'microsecond': "%Y-%m-%d %H:%M:%S.%f"
    }

    # 优先使用自定义格式
    if fmt:
        return datetime.now().strftime(fmt)

    # 验证精度参数
    if precision not in precision_formats:
        raise ValueError(
            f"无效的精度参数: {precision}，可选值：{list(precision_formats.keys())}"
        )

    return datetime.now().strftime(precision_formats[precision])


def get_current_date() -> str:
    """获取当前日期（年-月-日）"""
    return get_current_time(precision='day')


def get_current_time_of_day() -> str:
    """获取当前时间（时:分:秒），不含日期"""
    return datetime.now().strftime("%H:%M:%S")


def get_timestamp(precision: str = "second") -> Union[int, float]:
    """
    获取当前时间戳

    :param precision: 时间戳精度，可选值：
        - 'second': 秒级（整数，默认）
        - 'millisecond': 毫秒级（整数）
        - 'microsecond': 微秒级（浮点数）
    :return: 对应精度的时间戳
    :raises ValueError: 当 precision 为无效值时触发
    """
    now = datetime.now()
    timestamp = now.timestamp()  # 微秒级浮点数（10位秒 + 6位微秒）

    if precision == 'second':
        return int(timestamp)
    elif precision == 'millisecond':
        return int(timestamp * 1000)
    elif precision == 'microsecond':
        return timestamp
    else:
        raise ValueError(
            f"无效的时间戳精度: {precision}，可选值：['second', 'millisecond', 'microsecond']"
        )


# 示例用法（模块导入时不会执行）
if __name__ == "__main__":
    print("===== 时间字符串示例 =====")
    print("年份:", get_current_time('year'))
    print("年月:", get_current_time('month'))
    print("日期:", get_current_date())
    print("时分:", get_current_time('minute'))
    print("秒级:", get_current_time('second'))
    print("微秒级:", get_current_time())
    print("自定义格式:", get_current_time(fmt="%m/%d %H:%M"))
    print("当天时间:", get_current_time_of_day())

    print("\n===== 时间戳示例 =====")
    print("秒级时间戳:", get_timestamp())
    print("毫秒级时间戳:", get_timestamp('millisecond'))
    print("微秒级时间戳:", get_timestamp('microsecond'))







'''
只返回时间相关的数字，无格式
'''
"""
时间工具模块：仅返回时间相关数字（无分隔符）
支持不同精度的纯数字时间格式
"""
from datetime import datetime
from typing import Union


def get_current_time_digits(precision: str = "microsecond") -> str:
    """
    获取当前时间的纯数字形式（无分隔符）

    :param precision: 时间精度，可选值：
        - 'year': 仅年份（4位）
        - 'month': 年+月（6位，如202511）
        - 'day': 年+月+日（8位，如20251112）
        - 'hour': 年+月+日+时（10位，如2025111215）
        - 'minute': 年+月+日+时+分（12位，如202511121530）
        - 'second': 年+月+日+时+分+秒（14位，如20251112153045）
        - 'microsecond': 完整数字（20位，含微秒，如20251112153045123456）（默认）
    :return: 纯数字时间字符串
    :raises ValueError: 当precision为无效值时触发
    """
    # 预定义精度对应的数字格式（无分隔符）
    precision_formats = {
        'year': "%Y",
        'month': "%Y%m",
        'day': "%Y%m%d",
        'hour': "%Y%m%d%H",
        'minute': "%Y%m%d%H%M",
        'second': "%Y%m%d%H%M%S",
        'microsecond': "%Y%m%d%H%M%S%f"
    }

    if precision not in precision_formats:
        raise ValueError(
            f"无效的精度参数: {precision}，可选值：{list(precision_formats.keys())}"
        )

    return datetime.now().strftime(precision_formats[precision])


def get_time_of_day_digits(precision: str = "second") -> str:
    """
    获取当天时间的纯数字形式（不含日期，无分隔符）

    :param precision: 时间精度，可选值：
        - 'hour': 仅小时（2位，如15）
        - 'minute': 时+分（4位，如1530）
        - 'second': 时+分+秒（6位，如153045）（默认）
        - 'microsecond': 时+分+秒+微秒（12位，如153045123456）
    :return: 当天时间的纯数字字符串
    :raises ValueError: 当precision为无效值时触发
    """
    time_formats = {
        'hour': "%H",
        'minute': "%H%M",
        'second': "%H%M%S",
        'microsecond': "%H%M%S%f"
    }

    if precision not in time_formats:
        raise ValueError(
            f"无效的时间精度: {precision}，可选值：{list(time_formats.keys())}"
        )

    return datetime.now().strftime(time_formats[precision])


# 示例用法
if __name__ == "__main__":
    print("===== 包含日期的纯数字时间 =====")
    print("年份:", get_current_time_digits('year'))  # 2025
    print("年月:", get_current_time_digits('month'))  # 202511
    print("年月日:", get_current_time_digits('day'))  # 20251112
    print("年月日时分:", get_current_time_digits('minute'))  # 202511121530
    print("完整数字（含微秒）:", get_current_time_digits())  # 20251112153045123456

    print("\n===== 仅当天时间的纯数字 =====")
    print("时分:", get_time_of_day_digits('minute'))  # 1530
    print("时分秒:", get_time_of_day_digits())  # 153045
    print("时分秒微秒:", get_time_of_day_digits('microsecond'))  # 153045123456